function err = Bpfun(x, P, T, hiddennum, P_test, T_test)
%% 训练与测试BP网络
%% 输入
% x:一个个体的初始权值和阈值
% P:训练样本输入
% T:训练样本输出
% hiddennum:隐含层神经元数
% P_test:测试样本输入
% T_test:测试样本期望输出
%% 输出
% err:预测样本的预测误差的范数
inputnum = 4;          % 输入层神经元个数
outputnum = 3;         % 输出层神经元个数
%% 新建BP网络
% net = feedforwardnet(hiddennum);
% net = configure(net, P, T);
% net.layers{2}.transferFcn = 'logsig';
net = newff(P,T,hiddennum,{'tansig','purelin'},'trainlm');
%% 设置网络参数：训练次数为1000次，训练目标为0.01，学习速率为0.1
net.trainParam.epochs = 1000;
net.trainParam.goal = 1*10^-5;
net.trainParam.lr = 0.1;
net.trainParam.show = NaN;
net.trainParam.showwindow = false;      % 使用高版本MATLAB不显示图形框

%% 神经网络初始权值和阈值
w1num = inputnum * hiddennum;           % 输入层到隐含层的权值个数
w2num = outputnum * hiddennum;          % 隐含层到输出层的权值个数
w1 = x(1 : w1num);                      % 初始输入层到隐含层的权值
B1 = x(w1num + 1 : w1num + hiddennum);  % 隐含层神经元阈值
w2 = x(w1num + hiddennum + 1 : w1num + hiddennum + w2num);  % 初始隐含层到输出层的权值
B2 = x(w1num + hiddennum + w2num + 1 : w1num + hiddennum + w2num + outputnum);  % 输出层阈值
net.iw{1, 1} = reshape(w1, hiddennum, inputnum);            % 输入层到隐含层的权值
net.lw{2, 1} = reshape(w2, outputnum, hiddennum);           % 隐含层到输出层的权值
net.b{1} = reshape(B1, hiddennum, 1);
net.b{2} = reshape(B2, outputnum, 1);

%% 训练网络
net = train(net, P, T);
%% 测试网络
Y = zeros(3,50);
Y = sim(net, P_test);
global Y2
Y2 = zeros(1,50);
Y2 = vec2ind(Y);       %数据归一化，得到数据最大值的索引
% err = norm(Y - T_test);
err=(sum(Y2==T_test)/50*100).^(-1);

end